"""
金叉：2，死叉：-2  向上：1  向下：-1
支持重复计算，但是要指定timekey，只能向前重复计算
"""
class cross:
    def __init__(self):
        self.fx=None
        self.timekey=None
        self.his=[]
    def oncalc(self,fast,slow,timekey=None):
        if fast is not None and slow is not None:
            if timekey   is not None:
                if timekey==self.timekey:
                    self.his.pop()
                    self.fx=self.his[-1]
            if self.fx is not None:
                if self.fx >= 1:
                    if fast < slow:  # 死叉
                        self.fx = -2
                    else:
                        self.fx = 1
                elif self.fx<=-1:
                    if fast > slow:  # 金叉
                        self.fx = 2
                    else:
                        self.fx = -1
            else:
                if fast > slow:
                    self.fx = 1
                elif fast < slow:
                    self.fx = -1
            if timekey   is not None:
                self.timekey=timekey
                self.his.append(self.fx)
                while len(self.his)>2:
                    self.his.pop(0)
        return self.fx
class cross_price:
    def __init__(self):
        self.fx=None
        self.timekey=None
        self.his=[]
    def oncalc(self,fast,slow,timekey=None):
        if fast is not None:
            if slow is not None:
                if timekey   is not None:
                    if timekey==self.timekey:
                        self.his.pop()
                        self.fx=self.his[-1]
                if self.fx is not None:
                    if self.fx >= 1:
                        if fast < slow:  # 死叉
                            self.fx = -2
                        else:
                            self.fx = 1
                    elif self.fx<=-1:
                        if fast > slow:  # 金叉
                            self.fx = 2
                        else:
                            self.fx = -1
                else:
                    if fast > slow:
                        self.fx = 1
                    elif fast < slow:
                        self.fx = -1
                if timekey   is not None:
                    self.timekey=timekey
                    self.his.append(self.fx)
                    while len(self.his)>2:
                        self.his.pop(0)
        return self.fx

if __name__ == '__main__':
    from jili.core import load, save
    from research.calcor.calcors_graph import graph_calcor
    k1m = load(r"D:\data\future_k1m_tq\TA005\TA005_20200102.pkl")
    from research.calcor.dim2.cross import cross
    cross0=cross()
    cc = [{'calc_cmd': 'ta', 'cmd': 'EMA', 'out': ['ema30'], 'input': {'price': 'close'}, 'arg': {'timeperiod': 30},
           'batch': 30},
          {'calc_cmd': 'ta', 'cmd': 'EMA', 'out': ['ema10'], 'input': {'price': 'close'}, 'arg': {'timeperiod': 10},
           'batch': 10},
          {'calc_cmd': 'function', 'function': cross0.oncalc, 'out': 'cross0', 'input': ["ema10", "ema30","timekey"]}]
    c = graph_calcor(cc)
    k1ms=k1m[:32]
    for t in k1ms:
        t = c.onbar(t)
    print(t)
    t1 = k1m[32]
    t1["timekey"]=t["timekey"]
    t1=c.onbar(t1)
    print(t1)
    print("end")